﻿using System;
using System.Collections.Generic;

namespace DTO.Clases
{
    /// <summary>
    /// Representa una clase para Producto.
    /// </summary>
    public class Producto
    {
        /// <summary>
        /// Representa el texto: Activo
        /// </summary>
        private const string Activo = "Activo";

        /// <summary>
        /// Representa el texto: Inactivo
        /// </summary>
        private const string Inactivo = "Inactivo";

        /// <summary>
        /// Inicializa una nueva instancia de la clase Producto.
        /// </summary>
        public Producto()
        {
            this.CodigoInternoProducto = "";
            this.CodigoBarrasProducto = "";
            this.ReferenciaProducto = "";
            this.NombreProducto = "";
            this.DescripcionProducto = "";
            this.CodigoCategoria = "";
            this.IdMarca = 0;
            this.UtilidadPorcentualProducto = 0;
            this.ValorVentaProducto = 0;
            this.AplicaPrecioPorcentaje = true;
            this.IdIva = 0;
            this.UnidadVentaProducto = 0;
            this.CantidadMinimaProducto = 0;
            this.CantidadMaximaProducto = 0;
            this.EstadoProducto = true;
            this.CantidadDecimal = false;
        }

        #region Atributos Propios

        /// <summary>
        /// Obtiene o estabelce el Codigo del Producto.
        /// </summary>
        public string CodigoInternoProducto { set; get; }

        /// <summary>
        /// Obtiene o estabelce el Codigo de Barras del Producto.
        /// </summary>
        public string CodigoBarrasProducto { set; get; }

        /// <summary>
        /// Obtiene o establece la Referencia del Producto.
        /// </summary>
        public string ReferenciaProducto { set; get; }

        /// <summary>
        /// Obtiene o establece el Nombre del Producto
        /// </summary>
        public string NombreProducto { set; get; }

        /// <summary>
        /// Obtiene o establece la Descripcion del Producto.
        /// </summary>
        public string DescripcionProducto { set; get; }

        /// <summary>
        /// Obtiene o establece el Codigo de la Categoria del Producto.
        /// </summary>
        public string CodigoCategoria { set; get; }

        /// <summary>
        /// Obtiene o establece el id de la marca del Producto.
        /// </summary>
        public int IdMarca { set; get; }

        /// <summary>
        /// Obtiene o establece la utilidad procentual del Producto.
        /// </summary>
        public double UtilidadPorcentualProducto { get; set; }

        /// <summary>
        /// Obtiene o establece el valor de venta del Producto.
        /// </summary>
        public int ValorVentaProducto { get; set; }

        /// <summary>
        /// Obtiene o establece el valor del descuento.
        /// </summary>
        public double Descuento { set; get; }

        /// <summary>
        /// Obtiene o establece el valor del recargo.
        /// </summary>
        public double Recargo { set; get; }

        /// <summary>
        /// Obtiene o establece el listado de Descuentos del Producto.
        /// </summary>
        public List<Descuento> Descuentos { set; get; }

        /// <summary>
        /// Obtiene o establece el listado de Recargos del Producto.
        /// </summary>
        public List<Recargo> Recargos { set; get; }

        /// <summary>
        /// Obtiene o establece si indica que el precio se basa en porcentaje de ganancia. Por defecto es true.
        /// </summary>
        public bool AplicaPrecioPorcentaje { set; get; }

        /// <summary>
        /// Obtiene o establece el Id del valor del Iva del Producto.
        /// </summary>
        public int IdIva { get; set; }

        /// <summary>
        /// Obtiene o establece el Id de la medida.
        /// </summary>
        public int IdMedida { set; get; }

        /// <summary>
        /// Obtiene o Establece el listado de Medidas del Producto.
        /// </summary>
        public List<ValorUnidadMedida> Medidas { set; get; }

        /// <summary>
        /// Obtiene o establece la lista de inventario de producto.
        /// </summary>
        public List<Inventario> Inventarios { set; get; }

        /// <summary>
        /// Obtiene o establece la unidad de venta del Producto.
        /// </summary>
        public int UnidadVentaProducto { set; get; }

        /// <summary>
        /// Obtiene o establece la cantidad minima que debe haber en inventario del Producto.
        /// </summary>
        public int CantidadMinimaProducto { get; set; }

        /// <summary>
        /// Obtiene o establece la cantidad maxima que debe haber en inventario del Producto.
        /// </summary>
        public int CantidadMaximaProducto { get; set; }

        /// <summary>
        /// Obtiene o establece el Estado del Producto. Por defecto es true.
        /// </summary>
        public bool EstadoProducto { get; set; }

        /// <summary>
        /// Obtiene o establece si el producto aplica medida en Talla.
        /// </summary>
        public bool AplicaTalla { set; get; }

        /// <summary>
        /// Obtiene o establece si el producto aplica color.
        /// </summary>
        public bool AplicaColor { set; get; }

        public bool CantidadDecimal { set; get; }

        #endregion

        #region Atributos de Presentacion y Edicion

        /// <summary>
        /// Obtiene o establece la descripcion del Estado del producto.
        /// </summary>
        public string TextoEstado
        {
            get
            {
                if (this.EstadoProducto)
                {
                    return Activo;

                }
                else
                    return Inactivo;
            }
        }

        /// <summary>
        /// Obtiene o establece el Nombre de la categoria del producto.
        /// </summary>
        public string NombreCategoria { get; set; }

        /// <summary>
        /// Obtiene o establece la unida de medida del producto.
        /// </summary>
        public string UnidadMedida { get; set; }

        /// <summary>
        /// Obtiene o establece el Iva del producto.
        /// </summary>
        public double ValorIva { get; set; }

        /// <summary>
        /// Obtiene o establece el nombre de la marca del producto.
        /// </summary>
        public string NombreMarca { get; set; }

        /// <summary>
        /// Obtiene o establece valor de la unidad de medida del producto.
        /// </summary>
        public string ValorUnidadMedida { set; get; }

        /// <summary>
        /// Obtiene o Establece el codigo editado.
        /// </summary>
        public string CodigoInternoEditado { set; get; }  

        #endregion
    }
}